3
תגובות

אבטחה עם CODEIGNITER

פתח Ben ,
היי.
במידה והמערכת שלי תעבוד בצורה הבאה:

אם אני נכנס לקישור:
www.site.com/categories/cars


אז המערכת הולכת לדוגמא לטבלה categories ומחפשת את השורה שה title שלה הוא cars ומחזיר לי את כל השורה (קוד למטה) אם במקום cars הייתי כותב abc אז המערכת הייתה מחפשת שורה שיש בה abc (כנל categories).
ואין שום קובץ אחד שבודק או מסנן, פשוט כמו שזה.

השאלה שלי האם זה טוב או מהווה סכנה למערכת ?

הקוד בצורה הבאה בקונטרולר:
public function index(){
    $category = $this->Categories_model->get_category_by_url_title(urldecode($this->uri->segment(2)));
        if (!$category || trim($this->uri->segment(2)) == '')
            show_404();

        $data = array(
            'template' => 'categories/index',
            'category' => $category
        );
   
        $this->load->view('template', $data);
  }

בcategories מודל:
public function get_category_by_url_title($url_title)
    {
        $this->db->where(array(
           'url_title' => $url_title
        ));
        $this->db->limit(1);
        $query = $this->db->get('categories');

        if ($query)
        {
            return $query->row();
        }
        return FALSE;
    }


ובview אני מציג לדוגמא ככה:
$category->title;


יש לי Routing:
$route['categories/(:any)'] = 'categories/index';


אני מקווה שהבנתם למה אני מתכוון . כשאני מנסה להכניס כל מיני תווים מוזרים במקום cars או categories זה מראה שגיאה שתווים כאלה לא מורשים. האם זה מובנה ב CI ? אני יכול לעשות את מה שאמרתי בלי חשש כלשהו לחור ?
* יש טבלת קטגוריות באתר שמכילה את שם הקטגוריה , url_title שזה בעצם מה שיהיה בקישור, ועוד כל מיני דברים של המערכת.

*לפי כל מה שלמדתי ב PHP זה שפשוט לא לסמוך על מה שאתה מקבל מהגולש, אני אומר את מה שאני אומר בגלל שראיתי את זה במערכת כלשהי ורציתי לדעת.

אני יודע שיש את ההגנה הזאת ב URI, השאלה האם זה מספיק?:
CodeIgniter is fairly restrictive regarding which characters it allows in your URI strings in order to help minimize the possibility that malicious data can be passed to your application. URIs may only contain the following:

Alpha-numeric text (latin characters only)
Tilde: ~
Percent sign: %
Period: .
Colon: :
Underscore: _
Dash: -
Space

3 תשובות

avatar ענה intval ב 12 ליולי 2015 #

מצד אחד כל הכבוד שאתה מעלה את הנושא
מצד שני די על פני השטח מה קורה עם הנתונים שלך. אחרי שאתה מזין משהו בקישור הפריימוורק מחפש את זה בטבלה מאוד ספציפית לפי שדה מאוד מסוים. אין כאן שום דרך להוציא נתונים אחרים מתוך המסד בשום צורה שהיא.
לגבי תוים מוזרים בכתובת, אולי אפשר לכבות את זה, אבל בעיקרון מה שיקרה, הוא לא משנה אילו תויים יהיו בכתובת, תתבצע שאילתה למסד שעברה הגנה מפני sql injection, ולכן פשוט לא ימצאו שורות תואמות וכנראה תצטרך להחזיר עמוד 404. אני לא רואה שום בעיות במקרה הזה. יכולה להיות לך בעיה של xss אם למישהו מלבדך יש אפשרות לערוך את הכותרות ולרשום בהם משהו כמו קוד javascript וכאן צריך לזכור להשתמש באיזושהי שטות כמו

$this->security->xss_clean()

avatar ענה intval ב 12 ליולי 2015 #

ל- this->db->where
יש פרמטר שלישי שגם הוא עושה פילטרינג נגד xss

avatar ענה Ben ב 13 ליולי 2015 #

אחלה, תודה רבה!
אקרא על הפרמטר השלישי.
לא ידעתי שהשאילתה עוברת הגנה מפני sql injection, עמוד 404 בהחלט מוחזר.
אין אפשרות לאף אחד לערוך שום דבר לכן אין צורך בשטות הזאת.
את הפרמטר השלישי ל WHERE אוסיף שיהיה ליתר בטחון זה לא מפריע לאף אחד